contents

프로그래밍에서 매우 중요한 블로킹(blocking)/논블로킹(non-blocking)동기(synchronous)/비동기(asynchronous) 개념에 대해 알아보겠습니다.

프로그래밍에서 이 개념들은 특히 파일 읽기, 네트워크 통신, 데이터베이스 조회 같은 입출력(I/O) 작업을 처리할 때 프로그램이 얼마나 효율적이고 빠르게 반응하는지를 결정하는 핵심 요소입니다.


기본 개념: 프로그램 실행과 I/O

프로그램을 주방에서 일하는 셰프라고 상상해 보세요. 셰프는 레시피(코드)에 적힌 순서대로 일을 처리합니다. 야채를 써는 것처럼 바로 끝나는 일도 있지만, 케이크를 굽거나 배달을 기다리는 것처럼 시간이 오래 걸리는 일도 있죠.

프로그래밍에서 I/O 작업은 바로 이 "기다리는" 일에 해당합니다. 프로그램이 외부 자원(디스크, 네트워크 등)에 데이터를 요청하면, 그 응답이 올 때까지 기다려야 합니다. 바로 이 기다리는 방식의 차이에서 블로킹/논블로킹과 동기/비동기 개념이 등장합니다.


블로킹 (Blocking) vs. 논블로킹 (Non-Blocking)

이 구분은 작업을 기다리는 동안 프로그램(또는 실행 스레드)이 무엇을 하는지에 대한 이야기입니다.

블로킹 (Blocking) 🚫

블로킹 방식은 특정 작업이 완전히 끝날 때까지 프로그램(해당 스레드)이 실행을 멈추고 기다리는 것을 의미합니다. 블로킹된 작업이 결과를 반환할 때까지 그 스레드에서는 다른 어떤 코드도 실행될 수 없습니다.


논블로킹 (Non-Blocking) ✅

논블로킹 방식은 작업을 시작시킨 후, 그 작업이 끝날 때까지 기다리지 않고 즉시 다음 코드를 실행하는 것을 의미합니다. 요청한 작업은 백그라운드에서 실행되며, 프로그램은 나중에 작업이 끝났는지 확인하거나 완료 통보를 받아야 합니다.


동기 (Synchronous) vs. 비동기 (Asynchronous)

이 구분은 작업의 완료를 어떻게 조율하는지, 그리고 호출자가 결과를 기다리는지에 대한 이야기입니다.

동기 (Synchronous) ⏳

동기 방식은 작업이 순서대로, 단계별로 수행되는 것을 의미합니다. 각 작업은 바로 앞의 작업이 완전히 끝나야만 시작될 수 있습니다. 함수를 호출한 쪽에서는 그 함수의 결과가 반환될 때까지 기다립니다.


비동기 (Asynchronous) ⚡

비동기 방식은 어떤 작업을 시작시킨 후, 그 작업이 완료되기를 기다리지 않고 즉시 다음 코드를 실행하는 것을 의미합니다. 비동기 작업이 나중에 완료되면, 프로그램에게 완료 사실을 알립니다. (예: 콜백 함수 호출, Promise 이행, 이벤트 발생 등)


개념 간의 관계 정리

이 개념들은 서로 밀접하게 연관되어 있습니다.

일반적인 조합:

  1. 동기 & 블로킹 (가장 흔함):

    • 호출자가 작업을 요청하고, 작업이 끝나 결과를 받을 때까지 멈춰서 기다립니다.

    • 예시: 대부분의 언어에서 기본적인 파일 읽기(file.read()) 함수.

  2. 비동기 & 논블로킹 (응답성과 동시성에 이상적):

    • 호출자가 작업을 요청하고, 즉시 다른 일을 계속하며, 나중에 작업이 완료되면 통보를 받아 결과를 처리합니다.

    • 예시: 웹 브라우저의 fetch API, Node.js의 거의 모든 I/O, Python의 asyncio.


이 개념들이 왜 중요할까요?

  1. 애플리케이션 응답성: GUI 애플리케이션(웹, 데스크톱)에서 블로킹 작업 하나가 전체 프로그램을 멈추게 할 수 있습니다. 비동기/논블로킹은 부드러운 사용자 경험을 위해 필수적입니다.

  2. 서버 확장성: 웹 서버처럼 수많은 동시 요청을 처리해야 하는 경우, 비동기/논블로킹 모델은 적은 리소스(스레드)로 더 많은 요청을 효율적으로 처리할 수 있게 해줍니다.

  3. 리소스 활용: 블로킹 방식은 I/O를 기다리는 동안 CPU를 낭비하지만, 논블로킹 방식은 그 시간에 다른 유용한 작업을 수행하여 CPU 활용률을 극대화합니다.

결론

간단히 요약하자면:

실제 프로그래밍에서는 주로 동기+블로킹 방식과 비동기+논블로킹 방식의 두 가지 조합을 중심으로 코드를 작성하게 됩니다. 이 두 가지 방식의 차이를 정확히 이해하면 더 빠르고 효율적인 애플리케이션을 만드는 데 큰 도움이 될 것입니다.

references